package com.cos.lession73.provider;

import com.cos.lession73.ResourceTable;
import com.cos.lession73.entity.City;
import ohos.aafwk.ability.AbilitySlice;
import ohos.agp.components.*;
import ohos.biometrics.authentication.IFaceAuthentication;

import java.util.List;

/**
 * city list container 数据提供者(适配器)
 */
public class CityProvider extends BaseItemProvider {
    //保存要输出的数据列表
    private List<City> list;
    //为了给ListContainer写出Item_city.xml的布局使用
    private AbilitySlice slice;

    public CityProvider(List<City> list, AbilitySlice slice) {
        this.list = list;
        this.slice = slice;
    }

    public CityProvider() {
    }

    /**
     *  获取数据的总数
     * @return
     */
    @Override
    public int getCount() {
        //当list数据不为null即返回list元素个数,如果为Null就返回默认值0
        return list!=null?list.size():0;
    }

    /**
     * 返回数据对象的方法
     * @param i
     * @return
     */
    @Override
    public Object getItem(int i) {
        //判断 列表数据不为Null 并且 传入的i不能小于0 并且i的值必须在列表的数据条数范围之内
        if (list != null&&i>=0&&i<list.size()) {
            //返回单个数据出去
            return list.get(i);
        }
        return null;
    }

    /**
     * 返回列表数据的下标值
     * @param i
     * @return
     */
    @Override
    public long getItemId(int i) {
        //直接原路即可
        return i;
    }

    /**
     * 返回布局组件使用的方法
     *      我们需要在ability_main.xml 里面的ListContainer一直输出 item_city.xml的布局进去
     *      让他暂时数据,需要这个方法提供对应可用的布局组件,给ListContainer
     * @param i 下标
     * @param component 组件对象
     * @param componentContainer 组件容器
     * @return
     */
    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
        //判断component 是否为null 有没有传入需要使用的 item_city的布局组件进来
        if (component == null) {
            //component 为null,没有这个组件对象,就需要自己去加载item_city的布局组件进来
            //通过LayoutScatter获取组件的实例
            component = LayoutScatter
                    .getInstance(slice)
                    //parse是吧xml布局转换为组件对象
                    //参数parse(布局组件的id,根组件,是否把布局组件的id对应的组件对象加入到根组件中)
                    .parse(ResourceTable.Layout_ability_item_city,null,false);
        }
        // 数据的渲染
        //使用 id 获取要渲染数据的 text组件对象
        Text text = (Text) component.findComponentById(ResourceTable.Id_city_name);
        // 从list中获取数据 设置进 text组件中,进行数据渲染
        City city = list.get(i);
        text.setText(city.getCityName());
        //返回已经渲染好数据的text组件 给container使用
        return text;
    }
}
